建造者模式
1. 概述
建造者模式,优势在于能够通过链式编程生成对象,且用户不需要关心建造的细节。
缺点:产生多余的Builder的内部类,内部修改困难,如果产品内部发生变化,建造者也需要做相应的修改。
2. 思路
- 创建一个静态内部类Builder作为建造者,此类与外部类拥有的属性相同。
- 在静态内部类中,必须传递的参数通过公开的构造器进行传参赋值,可选的参数则通过建造者的setter方法进行传参。
- 在静态内部类中,生成一个建造外部类的方法build来调用外部类的构造器获取实例。
- 构造器私有化,且只保留一个通过建造者建造的构造器,同时完成二者的参数赋值。
使用:
通过调用此类的静态内部类生成实例。
Computer computer = new Computer.Builder("M1 ULTRA", "64GB")
.buildMouse("妙控鼠标")
.buildKeyboard("妙控键盘")
.buildMonitor("Displays")
.build();
3. 示例代码
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class Computer {
private final String cpu; // 必选
private final String ram; // 必选
private final String mouse;
private final String keyboard;
private final String monitor;
private Computer (Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.mouse = builder.mouse;
this.keyboard = builder.keyboard;
this.monitor = builder.monitor;
}
static class Builder {
private String cpu;
private String ram;
private String mouse;
private String keyboard;
private String monitor;
public Builder(String cpu, String ram) {
this.cpu = cpu;
this.ram = ram;
}
public Builder buildMouse(String mouse) {
this.mouse = mouse;
return this;
}
public Builder buildKeyboard(String keyboard) {
this.keyboard = keyboard;
return this;
}
public Builder buildMonitor(String monitor) {
this.monitor = monitor;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
class Main {
public static void main(String[] args) {
Computer computer = new Computer.Builder("M1 ULTRA", "64GB")
.buildMouse("妙控鼠标")
.buildKeyboard("妙控键盘")
.buildMonitor("Displays")
.build();
System.out.println(computer); // Computer(cpu=M1 ULTRA, ram=64GB, mouse=妙控鼠标, keyboard=妙控键盘, monitor=Displays)
}
}
4. 适用场景
- 对象有非常复杂的内部结构 , 有很多属性 ;
- 想把复杂对象的创建和使用分离 ;
- 当创造一个对象需要很多步骤时 , 适合使用建造者模式 ;
- 当创造一个对象只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;